home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / UNIXLIB37B / src / ReadMe
Text File  |  1993-02-14  |  10KB  |  196 lines

  1.  
  2.  
  3.         UnixLib v3.6c Maintenance Documentation
  4.  
  5.  
  6. Directories marked '#' below contain proprietary source code. Source code
  7. in these directories is Copyright 1990/1991/1992/1993 H.Rogers and XFM
  8. Software, and may only be distributed or modified in connection with UnixLib
  9. development. All other use or distribution is strictly prohibited.
  10. This entire paragraph and the list of directories below must be present
  11. in a file called "ReadMe" in a prominent place on all media used to
  12. distribute the aforementioned source code or derivations thereof. Failure
  13. to comply with the above requirements is breach of copyright and other
  14. international laws.
  15.  
  16.  
  17.     !Alias              * Alias file (see "ReadMe")
  18.     !Boot            !Boot for UnixLib maintenance
  19.     clib              * Library directory
  20.     clib.h              * UnixLib ANSI header files
  21.     clib.o              * UnixLib directory
  22.     clib.o.unixlib          * UnixLib itself
  23.     clib.sys.h          * UnixLib specific header files
  24.     etc              * UnixLib version of /etc
  25.     ReadMe              * Documentation for UnixLib - this file
  26.     src            Source code
  27.     src.ReadMe        Documentation for source code
  28.     src.o            UnixLib portable object code
  29.     src.c              # UnixLib portable source code
  30.     src.stdio.o        UnixLib stdio object code
  31.     src.stdio.c          # UnixLib stdio source code
  32.     src.unix.c        UnixLib UNIX emulation source code
  33.     src.unix.o        UnixLib UNIX emulation object code
  34.     src.sys.c        UnixLib RiscOS related source code
  35.     src.sys.s        UnixLib RiscOS related source code (ARM code)
  36.     src.sys.o        UnixLib RiscOS related object code
  37.     test            UnixLib test programs
  38.     test.ReadMe        Documentation for test programs
  39.  
  40.  
  41. Asterisked files/directories are those that are necessary to compile
  42. programs with UnixLib. If you are installing UnixLib onto a hard disk you
  43. are advised not to change the organization of the directory tree other than
  44. to move etc into the root directory, since updates will be issued with
  45. this structure.
  46.  
  47.         How UnixLib Works
  48.  
  49. First - a comment on how the functions/variable definitions are
  50. split up between various object files. Storage allocation has been
  51. carefully thought out so as to minimise loading of unnecessary
  52. object files. This is why work variables used only in a particular
  53. object file, but which have to be initialised, will not be defined
  54. in the same place as where they are used. Thus: beware of shifting code
  55. or variables from one file to another. The minimum executable size is
  56. currently 24k.
  57.  
  58. In particular the stdio and vfork initialization/exit routines are
  59. conditionally linked in using AOF 'weak links' - if a program doesn't
  60. use stdio it won't get linked in with it. Similarly vfork(). The weak
  61. links are in sys.s._syslib and are documented in <sys/syslib.h>.
  62.  
  63. It is a good idea to look at the header files <sys/syslib.h> and
  64. <sys/unix.h> when reading this document - they are (hopefully :-))
  65. well commented. Also <sys/dev.h> and <sys/tty.h> should be understood.
  66.  
  67. The entry point for all programs is in sys.s._syslib. This is __main().
  68. __main() sets up the stack (__stack), break (cf UNIX) (__break), pointer
  69. to the command line used to invoke the program (__cli), and program
  70. start time (__time). The stack grows down from the top of user memory
  71. (as read by OS_GetEnv), and the break grows upwards from the top of the
  72. program data (RW) area.
  73.     __main() then calls _main() which is a C function (in sys.c.syslib).
  74. _main() initialises the signal handlers, exception handlers, floating point
  75. status (__fpflag), memory allocation (malloc() etc.), unix (calling
  76. __unixinit()), and stdio (calling __stdioinit()), in that order. Lastly
  77. _main() calls main() with the argc,argv that were generated by __unixinit().
  78.     __unixinit() first checks for the presence of the environment variable
  79. UnixLib$env. If this is set, it contains a value which is the address of a
  80. proc structure that should be inherited by the process, and no further
  81. initialisation is necessary (see <sys/unix.h> for details of the proc
  82. structure) - this is the case when one UnixLib program calls another using
  83. vfork() and execve(). The proc structure is pointed to by __u and is
  84. documented in <sys/unix.h> - look at this.
  85.     If UnixLib$env is unset, a default proc structure and FD set are
  86. generated, and FDs 0,1 and 2 are connected to the terminal defined by
  87. Unix$tty. The invoking command line (__cli) is copied in SVC mode, then
  88. scanned to form the argc, argv array and set any command line redirection.
  89. Lastly the environment variable Unix$uid is checked & processed as described
  90. in "ReadMe". __unixinit() also initialises the __fsdir[] structure array and
  91. __pipedir according to UnixFS$xxx and Unix$pipe as described in "ReadMe".
  92.  
  93. Various function calls are generated inline by the C compiler, and these
  94. functions are all in sys.s._syslib. They include the division, modulus,
  95. pointer check, stack overflow & profiling functions. The __memcpy() and
  96. __memset() functions are now in sys.s._mem: These are also called by the
  97. library memcpy() and memset() functions (and are written with some care in
  98. order to be particularly fast - approx. 4 times faster than in v3.2).
  99. Note the profiling functions merely return - profiling remains effectively
  100. unimplemented.
  101.  
  102. The low level exception handlers are in sys.s._signal, and the higher
  103. level UNIX abstraction (signal handlers) are dealt with in sys.c.signal.
  104. Note the use of OS_CallBack. It is unwise to mess with the ARM code in
  105. s._signal and s._syslib unless you *really* understand what's going on -
  106. the exception handling in particular is (and has to be) extremely nasty.
  107. Note UnixLib can recover from *all* signals/exceptions, unlike Acorn's
  108. AnsiLib, and implements far more (see <signal.h> and <sys/syslib.h>). 
  109.  
  110. UNIX system calls are implemented in unix.c.*, with the exception of alarm(),
  111. brk(), exit(), sbrk(), execve(), raise(), signal(), & vfork() since these
  112. interact closely with both RiscOS and the UnixLib internals - they are in
  113. sys.c.*.
  114.  
  115. sys.c.errlist contains the UNIX error list; RiscOS errors are flagged by
  116. calling __seterr() - in sys.c.os. This sets errno to EOS and sets the error
  117. string for perror() etc. You can also set the error string returned by
  118. perror() by calling __seterr_().
  119.  
  120. Also in the sys.s directory are the FP math routines, setjmp() & longjmp(),
  121. the ARM code parts of execve() and vfork(), and the RiscOS interface os_*().
  122. setjmp() & longjmp() modify their behaviour according to whether the FP is
  123. present or not - if not they don't bother saving the FP status and thus avoid
  124. generating SIGILL. execve() and vfork() are documented below.
  125.     The RiscOS interface is documented in <sys/os.h> and is pretty
  126. comprehensive. You can pass a null pointer to OS functions that store result
  127. registers in integer arrays, in which case no results are stored. os_swi(n,0)
  128. calls SWI n and assumes it doesn't require arguments (if it does it'll use
  129. garbage). os_print() & os_prhex() are useful for debugging messages as they
  130. guarantee output - note you must use OS newlines with os_print() i.e. "\r\n"
  131. not just "\n" as unix expects.
  132.  
  133. vfork() is implemented as an alias to setjmp() and longjmp() with some
  134. manipulation of the UNIX environment... Read the source code (sys.c.vfork
  135. and sys.s._vfork) to understand what it does/how it works. Also read the UNIX
  136. man page for vfork() - it's semantics are *not* normal. Despite it's
  137. restrictions vfork() can be used interchangeably with fork() as long as some
  138. care is taken...
  139.  
  140. execve() checks whether the current process is a child from a previous call
  141. to vfork() - if it isn't then it calls __reset() (see <sys/syslib.h>) and
  142. then overlays the current program with the new one (as per UNIX). If on the
  143. other hand it's a child, then it:
  144.  
  145.     0) Overwrites argv,argc and sets up a cli from the argc,argv array to
  146. subsequently pass to OS_CLI.
  147.     1) Closes all O_EXECCL file descriptors & turns off any alarm().
  148.     2) Turns off the __U_PPROC flag (see <sys/unix.h>) so that the
  149. subprogram is forced to exit fully.
  150.     3) Resets all exception handlers.
  151.     4) Calculates __exshift - the gap between the break and bottom of the
  152. stack - this is the amount by which the program will be copied up freeing
  153. memory for the subprogram.
  154.     5) Modifies the proc structure using the ushift() macro so that when
  155. it is copied up, all pointers are offset and thus correct. Note the check
  156. to see if each pointer is in the text/data area (the data could be on the
  157. stack and thus remain unmoved). This is done so that the proc structure can
  158. be inherited by the subprogram using UnixLib$env (see above).
  159.     6) Sets up __exec() & UnixLib$env.
  160.     7) Calls __exec() with the cli set up in 0).
  161.  
  162.     8) __exec() (in sys.s._exec) actually performs the copy up operation,
  163. sets the OS_GetEnv HIMEM to below the moved text area, sets up an exit
  164. handler, and calls OS_CLI. The exit handler resets the HIMEM, performs the
  165. copy down operation, and eventually calls __exret().
  166.  
  167.     9) __exret() shifts the proc structure pointers back down using the
  168. dshift() macro.
  169.     10) reinstalls exception handlers.
  170.     11) kills UnixLib$env in case it's still set.
  171.     12) Turns on the __U_PPROC flag.
  172.     13) Calls __vret() with the subprogram's Sys$ReturnCode.
  173.     14) __vret() returns as if from a vfork() back to the parent.
  174.  
  175. UnixLib I/O is abstracted by the __dev[] array defined in <sys/dev.h> and
  176. in unix.c.dev. The source code for open(), etc. is pretty self explanatory.
  177. unix.c.dev contains the FileCore interface, unix.c.tty the tty interface.
  178. Pipes are also in unix.c.dev. Note that the pipe() system call itself is in
  179. unix.c.pipe. Look at <sys/unix.h> to understand the __u->u_file[] array of
  180. file descriptors.
  181.  
  182. UNIX -> RiscOS filename conversion is in unix.c.uname.
  183.  
  184. Apologies if my indentation/coding style doesn't match with yours!
  185. In any case please maintain the library in a consistent format. Also
  186. apologies for the terse style of this documentation - You're probably
  187. better off reading the source code anyway...
  188.  
  189.  
  190.         How to Submit Patches/Bug Reports
  191.  
  192. If you find a bug, or patch a piece of code, please Email me with either
  193. the source code you patched (with a description of what's changed), or a
  194. description of the bug with any sample code that can be used to recreate
  195. the circumstances. See "ReadMe" for how to contact me.
  196.